package abs.service;

import abs.dao.ClientesDAO;
import abs.dao.CompaniasDAO;
import abs.dao.TipoClientesDAO;

import abs.domain.Clientes;
import abs.domain.Companias;
import abs.domain.TipoClientes;

import java.util.List;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

/**
 * Spring service that handles CRUD requests for TipoClientes entities
 * 
 */

@Service("TipoClientesService")
@Transactional
public class TipoClientesServiceImpl implements TipoClientesService {

	/**
	 * DAO injected by Spring that manages Clientes entities
	 * 
	 */
	@Autowired
	private ClientesDAO clientesDAO;

	/**
	 * DAO injected by Spring that manages Companias entities
	 * 
	 */
	@Autowired
	private CompaniasDAO companiasDAO;

	/**
	 * DAO injected by Spring that manages TipoClientes entities
	 * 
	 */
	@Autowired
	private TipoClientesDAO tipoClientesDAO;

	/**
	 * Instantiates a new TipoClientesServiceImpl.
	 *
	 */
	public TipoClientesServiceImpl() {
	}

	/**
	 * Delete an existing Companias entity
	 * 
	 */
	@Transactional
	public TipoClientes deleteTipoClientesCompanias(String tipoclientes_tipocl100cdgo, String related_companias_co000nocia) {
		TipoClientes tipoclientes = tipoClientesDAO.findTipoClientesByPrimaryKey(tipoclientes_tipocl100cdgo, -1, -1);
		Companias related_companias = companiasDAO.findCompaniasByPrimaryKey(related_companias_co000nocia, -1, -1);

		tipoclientes.setCompanias(null);
		related_companias.getTipoClienteses().remove(tipoclientes);
		tipoclientes = tipoClientesDAO.store(tipoclientes);
		tipoClientesDAO.flush();

		related_companias = companiasDAO.store(related_companias);
		companiasDAO.flush();

		companiasDAO.remove(related_companias);
		companiasDAO.flush();

		return tipoclientes;
	}

	/**
	 * Return a count of all TipoClientes entity
	 * 
	 */
	@Transactional
	public Integer countTipoClientess() {
		return ((Long) tipoClientesDAO.createQuerySingleResult("select count(o) from TipoClientes o").getSingleResult()).intValue();
	}

	/**
	 * Save an existing TipoClientes entity
	 * 
	 */
	@Transactional
	public void saveTipoClientes(TipoClientes tipoclientes) {
		TipoClientes existingTipoClientes = tipoClientesDAO.findTipoClientesByPrimaryKey(tipoclientes.getTipocl100cdgo());

		if (existingTipoClientes != null) {
			if (existingTipoClientes != tipoclientes) {
				existingTipoClientes.setTipocl100cdgo(tipoclientes.getTipocl100cdgo());
				existingTipoClientes.setTipocl100desc(tipoclientes.getTipocl100desc());
				existingTipoClientes.setTipocl100esta(tipoclientes.getTipocl100esta());
				existingTipoClientes.setTipocl100load(tipoclientes.getTipocl100load());
				existingTipoClientes.setTipocl100fead(tipoclientes.getTipocl100fead());
				existingTipoClientes.setTipocl100lomo(tipoclientes.getTipocl100lomo());
				existingTipoClientes.setTipocl100femo(tipoclientes.getTipocl100femo());
			}
			tipoclientes = tipoClientesDAO.store(existingTipoClientes);
		} else {
			tipoclientes = tipoClientesDAO.store(tipoclientes);
		}
		tipoClientesDAO.flush();
	}

	/**
	 * Load an existing TipoClientes entity
	 * 
	 */
	@Transactional
	public Set<TipoClientes> loadTipoClientess() {
		return tipoClientesDAO.findAllTipoClientess();
	}

	/**
	 * Save an existing Clientes entity
	 * 
	 */
	@Transactional
	public TipoClientes saveTipoClientesClienteses(String tipocl100cdgo, Clientes related_clienteses) {
		TipoClientes tipoclientes = tipoClientesDAO.findTipoClientesByPrimaryKey(tipocl100cdgo, -1, -1);
		Clientes existingclienteses = clientesDAO.findClientesByPrimaryKey(related_clienteses.getCl100cocl());

		// copy into the existing record to preserve existing relationships
		if (existingclienteses != null) {
			existingclienteses.setCl100cocl(related_clienteses.getCl100cocl());
			existingclienteses.setCl100nocia(related_clienteses.getCl100nocia());
			existingclienteses.setCl100cedu(related_clienteses.getCl100cedu());
			existingclienteses.setCl100nocl(related_clienteses.getCl100nocl());
			existingclienteses.setCl100prov(related_clienteses.getCl100prov());
			existingclienteses.setCl100ciud(related_clienteses.getCl100ciud());
			existingclienteses.setCl100diof(related_clienteses.getCl100diof());
			existingclienteses.setCl100teo1(related_clienteses.getCl100teo1());
			existingclienteses.setCl100emai(related_clienteses.getCl100emai());
			existingclienteses.setCl100rele(related_clienteses.getCl100rele());
			existingclienteses.setCl100cgre(related_clienteses.getCl100cgre());
			existingclienteses.setCl100cont(related_clienteses.getCl100cont());
			existingclienteses.setCl100tar1(related_clienteses.getCl100tar1());
			existingclienteses.setCl100tar2(related_clienteses.getCl100tar2());
			existingclienteses.setCl100dscp(related_clienteses.getCl100dscp());
			existingclienteses.setCl100fact(related_clienteses.getCl100fact());
			existingclienteses.setCl100tifa(related_clienteses.getCl100tifa());
			existingclienteses.setCl100fade(related_clienteses.getCl100fade());
			existingclienteses.setCl100cupo(related_clienteses.getCl100cupo());
			existingclienteses.setCl100obse(related_clienteses.getCl100obse());
			existingclienteses.setCl100ctadb(related_clienteses.getCl100ctadb());
			existingclienteses.setCl100ctacr(related_clienteses.getCl100ctacr());
			existingclienteses.setCl100load(related_clienteses.getCl100load());
			existingclienteses.setCl100fead(related_clienteses.getCl100fead());
			existingclienteses.setCl100lomo(related_clienteses.getCl100lomo());
			existingclienteses.setCl100femo(related_clienteses.getCl100femo());
			related_clienteses = existingclienteses;
		}

		related_clienteses.setTipoClientes(tipoclientes);
		tipoclientes.getClienteses().add(related_clienteses);
		related_clienteses = clientesDAO.store(related_clienteses);
		clientesDAO.flush();

		tipoclientes = tipoClientesDAO.store(tipoclientes);
		tipoClientesDAO.flush();

		return tipoclientes;
	}

	/**
	 */
	@Transactional
	public TipoClientes findTipoClientesByPrimaryKey(String tipocl100cdgo) {
		return tipoClientesDAO.findTipoClientesByPrimaryKey(tipocl100cdgo);
	}

	/**
	 * Save an existing Companias entity
	 * 
	 */
	@Transactional
	public TipoClientes saveTipoClientesCompanias(String tipocl100cdgo, Companias related_companias) {
		TipoClientes tipoclientes = tipoClientesDAO.findTipoClientesByPrimaryKey(tipocl100cdgo, -1, -1);
		Companias existingcompanias = companiasDAO.findCompaniasByPrimaryKey(related_companias.getCo000nocia());

		// copy into the existing record to preserve existing relationships
		if (existingcompanias != null) {
			existingcompanias.setCo000nocia(related_companias.getCo000nocia());
			existingcompanias.setCo000logo(related_companias.getCo000logo());
			existingcompanias.setCo000nomb(related_companias.getCo000nomb());
			existingcompanias.setCo000nosu(related_companias.getCo000nosu());
			existingcompanias.setCo000dire(related_companias.getCo000dire());
			existingcompanias.setCo000repr(related_companias.getCo000repr());
			existingcompanias.setCo000cont(related_companias.getCo000cont());
			existingcompanias.setCo000nreg(related_companias.getCo000nreg());
			existingcompanias.setCo000clca(related_companias.getCo000clca());
			existingcompanias.setCo000mofu(related_companias.getCo000mofu());
			existingcompanias.setCo000notr(related_companias.getCo000notr());
			existingcompanias.setCo000idtr(related_companias.getCo000idtr());
			existingcompanias.setCo000meci(related_companias.getCo000meci());
			existingcompanias.setCo000mepr(related_companias.getCo000mepr());
			existingcompanias.setCo000incc(related_companias.getCo000incc());
			existingcompanias.setCo000inut(related_companias.getCo000inut());
			existingcompanias.setCo000incp(related_companias.getCo000incp());
			existingcompanias.setCo000incf(related_companias.getCo000incf());
			existingcompanias.setCo000baca(related_companias.getCo000baca());
			existingcompanias.setCo000fir1(related_companias.getCo000fir1());
			existingcompanias.setCo000fir2(related_companias.getCo000fir2());
			existingcompanias.setCo000esta(related_companias.getCo000esta());
			existingcompanias.setCo000load(related_companias.getCo000load());
			existingcompanias.setCo000fead(related_companias.getCo000fead());
			existingcompanias.setCo000lomo(related_companias.getCo000lomo());
			existingcompanias.setCo000femo(related_companias.getCo000femo());
			related_companias = existingcompanias;
		}

		tipoclientes.setCompanias(related_companias);
		related_companias.getTipoClienteses().add(tipoclientes);
		tipoclientes = tipoClientesDAO.store(tipoclientes);
		tipoClientesDAO.flush();

		related_companias = companiasDAO.store(related_companias);
		companiasDAO.flush();

		return tipoclientes;
	}

	/**
	 * Return all TipoClientes entity
	 * 
	 */
	@Transactional
	public List<TipoClientes> findAllTipoClientess(Integer startResult, Integer maxRows) {
		return new java.util.ArrayList<TipoClientes>(tipoClientesDAO.findAllTipoClientess(startResult, maxRows));
	}

	/**
	 * Delete an existing TipoClientes entity
	 * 
	 */
	@Transactional
	public void deleteTipoClientes(TipoClientes tipoclientes) {
		tipoClientesDAO.remove(tipoclientes);
		tipoClientesDAO.flush();
	}

	/**
	 * Delete an existing Clientes entity
	 * 
	 */
	@Transactional
	public TipoClientes deleteTipoClientesClienteses(String tipoclientes_tipocl100cdgo, Integer related_clienteses_cl100cocl) {
		Clientes related_clienteses = clientesDAO.findClientesByPrimaryKey(related_clienteses_cl100cocl, -1, -1);

		TipoClientes tipoclientes = tipoClientesDAO.findTipoClientesByPrimaryKey(tipoclientes_tipocl100cdgo, -1, -1);

		related_clienteses.setTipoClientes(null);
		tipoclientes.getClienteses().remove(related_clienteses);

		clientesDAO.remove(related_clienteses);
		clientesDAO.flush();

		return tipoclientes;
	}
}
